package com.ccsoft.multithread.test;

import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @author chanchaw
 * @create 2022-07-22 14:12
 */
@Slf4j(topic = "c.futureTask")
public class No1FutureTask {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        log.debug("主线程开始执行...");
        // FutureTask 间接实现了接口 Runnable，所以可以当做 Runnable 一样使用
        FutureTask ft = new FutureTask(new Callable() {
            @Override
            public Object call() throws Exception {
                log.debug("running...");
                Thread.sleep(2000);
                return 200;
            }
        });

        // 使用上面的任务对象 ft 创建新的线程并命名为 firstFutureTask
        Thread t = new Thread(ft,"firstFutureTask");
        t.start();// 启动线程
        log.debug("子线程启动完毕，开始阻塞等待返回结果");
        // 下面使用 get 会阻塞主线程，所以前后两个日志应该相差2秒
        Integer result = (Integer) ft.get();
        log.debug("子线程返回的结果是：" + result);
    }
}
